'use strict';

import { app, protocol, globalShortcut } from 'electron';
import { createProtocol, installVueDevtools } from 'vue-cli-plugin-electron-builder/lib';
import { onReady, onActivate } from './electron';

const isDevelopment = process.env.NODE_ENV !== 'production';

// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.

const appLocked = app.requestSingleInstanceLock();

!appLocked
  ? app.quit()
  : (() => {
      // Scheme must be registered before the app is ready
      protocol.registerSchemesAsPrivileged([
        { scheme: 'app', privileges: { secure: true, standard: true } },
      ]);

      // Quit when all windows are closed.
      app.on('window-all-closed', () => {
        // On macOS it is common for applications and their menu bar
        // to stay active until the user quits explicitly with Cmd + Q
        if (process.platform !== 'darwin') {
          app.quit();
        }
      });

      // On macOS it's common to re-create a window in the app when the
      // dock icon is clicked and there are no other windows open.
      app.on('activate', onActivate);

      // This method will be called when Electron has finished
      // initialization and is ready to create browser windows.
      // Some APIs can only be used after this event occurs.
      app.on('ready', async () => {
        if (isDevelopment && !process.env.IS_TEST) {
          // Install Vue Devtools
          // Devtools extensions are broken in Electron 6.0.0 and greater
          // See https://github.com/nklayman/vue-cli-plugin-electron-builder/issues/378 for more info
          // Electron will not launch with Devtools extensions installed on Windows 10 with dark mode
          // If you are not using Windows 10 dark mode, you may uncomment these lines
          // eslint-disable-next-line max-len
          // In addition, if the linked issue is closed, you can upgrade electron and uncomment these lines
          try {
            await installVueDevtools();
          } catch (e) {
            console.error('Vue Devtools failed to install:', e.toString());
          }
        }

        onReady();
      });

      app.on('will-quit', () => {
        // Unregister all shortcuts.
        globalShortcut.unregisterAll();
      });

      // Exit cleanly on request from parent process in development mode.
      if (isDevelopment) {
        if (process.platform === 'win32') {
          process.on('message', (data) => {
            if (data === 'graceful-exit') {
              app.quit();
            }
          });
        } else {
          process.on('SIGTERM', () => {
            app.quit();
          });
        }
      }
    })();
